package net.maku.newbase.util.redis;

import lombok.Cleanup;
import net.maku.framework.common.config.RedisConfig;
import org.apache.commons.lang3.time.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

import java.util.List;

/**
 * Redis的工具类
 *
 * @版权所有 广东国星科技有限公司 www.mscodecloud.com
 */
@Component
public class RedisUtils {

    @Autowired
    private RedisConfig redisConfig;
    @Autowired
    private JedisPool pool;

    public final Long SECONDS = DateUtils.MILLIS_PER_SECOND;
    public final Long MINUTES = DateUtils.MILLIS_PER_MINUTE;
    public final Long HOUR = DateUtils.MILLIS_PER_HOUR;
    public final Long DAY = DateUtils.MILLIS_PER_DAY;

    /**
     * 持久化数据
     *
     * @param key    键
     * @param value  值
     * @param minute 保存多长（分） 没值默认一分钟
     * @param month  保存多久（月），如果有值，不考虑minute参数
     */
    public void psetex(String key, String value, Integer minute, Integer month) {
        Long date = MINUTES;
        if (month != null && month > 0)
            date = month * 30 * DAY;
        else if (minute != null && minute > 0)
            date = minute * MINUTES;

        psetex(key, date, value);
    }

    public void psetex(String key, String value) {
        psetex(key, value, null, null);
    }

    public void psetex(String key, Long time, String value) {
        System.out.println(link().psetex(key, time, value));
    }

    /**
     * 根据键删除数据
     *
     * @param key 键
     */
    public void del(String key) {
        link().del(key);
    }

    /**
     * 根据键获取值
     *
     * @param key 键
     * @return
     */
    public String get(String key) {
        return link().get(key);
    }

    /**
     * 判断键 是否存在
     *
     * @param key 键
     * @return
     */
    public boolean exists(String key) {
        return link().exists(key);
    }

    /**
     * 刷新并获取键（小时）
     *
     * @param key 键
     * @return
     */
    public String rGet(String key) {
        return rGet(key, HOUR);
    }

    /**
     * 刷新并获取键
     *
     * @param key  键
     * @param time 刷新时间
     * @return
     */
    public String rGet(String key, Long time) {
        link().pexpire(key, time);
        return link().get(key);
    }

    /**
     * 刷新
     *
     * @param key 键
     * @return
     */
    public void pexpire(String key, Long time) {
        link().pexpire(key, time);
    }

    /**
     * 左进右阻塞出 写
     *
     * @param key   键
     * @param value
     * @return
     */
    public void LPUSH(String key, String value) {
        link().lpush(key, value);
    }

    /**
     * 左进右阻塞出 读
     *
     * @param key 键
     * @return
     */
    public List<String> BRPOP(String key) {
        return link().brpop(0, key);
    }

    /**
     * 队列长度
     *
     * @param key 键
     * @return
     */
    public Long LLEN(String key) {
        return link().llen(key);
    }

    private Jedis link() {
        @Cleanup Jedis jedis = pool.getResource();
        return jedis;
    }

}